package filelisting

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"strings"
)

const prefix = "/list/"

type userError string

func (e userError) Error() string {
	return e.Message()
}

func (e userError) Message() string {
	return string(e)
}

func HandleFileList(writer http.ResponseWriter,
	request *http.Request) error {
	fmt.Println()
	//校验 path 长度
	if strings.Index(
		//不是/list开头的, 触发自定义error
		request.URL.Path, prefix) != 0 {
		//自定义的 userError, 允许返回给用户查看, 系统error比较敏感, 不适合给用户查看
		return userError(
			fmt.Sprintf("path %s must start "+
				"with %s",
				request.URL.Path, prefix))
	}
	//剔除prefix, 获取实际文件路径( /list/实际文件路径 )
	path := request.URL.Path[len(prefix):]
	fmt.Println("path=", path)
	//从 bs12-defer 目录开始计算
	file, err := os.Open(path)
	if err != nil {
		//给 errWrapper 统一处理, 不再自己处理
		return err
	}
	defer file.Close()

	//读取需要访问的文件
	all, err := ioutil.ReadAll(file)
	if err != nil {
		return err
	}

	//将读取到的文件写入到 ResponseWriter 中
	writer.Write(all)
	return nil
}
